package com.auicyh.tylb.comm;

import com.auicyh.tylb.constant.ErrorCode;
import com.auicyh.tylb.utils.LogUtils;
import com.auicyh.tylb.utils.TylbException;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 作者：  Ocean 2018/10/24 13:19
 * 信息：  Oil com.auicyh.tylb.comm
 * <p>
 * http://gqdy365.iteye.com/blog/2188906
 * http://blog.csdn.net/wodeluoye/article/details/49368529
 * https://code.google.com/p/android-serialport-api/
 * <p>
 * 邮箱：   1126067113@qq.com
 * 修改人：
 * 公司: 北京天元陆兵汽车科技有限公司
 *
 * @author Ocean
 */
public class SerialPort {

    /** 串口文件描述类，禁止删除或者改名，因为native层关闭串口时需要使用 */
    private FileDescriptor mFd;
    /** 输入流，用于接受串口数据 */
    private FileInputStream mFileInputStream;
    /** 输入流，用于接受串口数据 */
    private FileOutputStream mFileOutputStream;

    public SerialPort() {
    }

    /**
     * 构造函数
     *
     * @param device   串口名
     * @param baudRate 波特率
     * @param flags    操作标识
     *                 Runtime.getRuntime().exec("")  方法来执行命令或者创建进程。
     *
     * @throws TylbException 安全异常，当串口文件不可读写时触发
     * @throws TylbException IO异常，开启串口失败时异常
     */
    public SerialPort(File device, int baudRate, int flags) throws TylbException {
        if (!device.canRead() || !device.canWrite()) {
            // 若没有读写设备，试着chmod 该设备 chmod意为修改文件权限
            try {
                Process su;
                su = Runtime.getRuntime().exec("/system/bin/su");
                String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n";
                su.getOutputStream().write(cmd.getBytes());
                if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {
                    LogUtils.e(true,"不存在串口 1111111");
                    throw new TylbException("\t\t不存在串口模块，无效参数异常，端口号或波特率无效。", ErrorCode.ERROR_PCB_OPEN_ERROR_212);
                }
            } catch (Exception e) {
                LogUtils.e(true,"不存在串口 222222");
                throw new TylbException("\t\t不存在串口模块，无效参数异常，端口号或波特率无效。", ErrorCode.ERROR_PCB_OPEN_ERROR_212);
            }
        }
        mFd = open(device.getAbsolutePath(), baudRate, flags);
        if (mFd == null) {
            throw new TylbException("串口打开失败。", ErrorCode.ERROR_PCB_OPEN_ERROR_213);
        }
        mFileInputStream = new FileInputStream(mFd);
        mFileOutputStream = new FileOutputStream(mFd);
    }


    /**
     * 获取输入流，用于接受串口数据
     *
     * @return 出口输入流
     */
    public InputStream getInputStream() {
        return mFileInputStream;
    }

    public OutputStream getOutputStream() {
        return mFileOutputStream;
    }

    /**
     * 原生函数，开启串口虚拟文件
     *
     * @param path     串口虚拟文件路径
     * @param baudrate 波特率
     * @param flags    操作标识
     */
    private native static FileDescriptor open(String path, int baudrate, int flags);


    /**
     * 原生函数，关闭串口虚拟文件
     * com.auicyh.tylb.comm.SerialPort.close()
     * (tried
     * Java_com_auicyh_tylb_comm_SerialPort_close and
     * Java_com_auicyh_tylb_comm_SerialPort_close__)
     */
    public native void close();

   public native String stringFromJNI();

    static {
        System.loadLibrary("SerialPortComm");
    }
}
